Spring Boot ORM এর গুরুত্বপূর্ণ ফিচারগুলোর একটি হল Lazy Loading এবং Eager Loading, যা ডেটাবেস থেকে ডেটা রিট্রিভ করার সময় ডেটার লোডিং স্ট্র্যাটেজি নির্ধারণ করে। Hibernate (Spring Data JPA এর ডিফল্ট ইমপ্লিমেন্টেশন) এই দুই লোডিং কৌশল সরবরাহ করে।
Lazy Loading
Lazy Loading হল এমন একটি লোডিং পদ্ধতি যেখানে ডেটা শুধুমাত্র যখন প্রয়োজন হয় তখনই ডেটাবেস থেকে রিট্রিভ করা হয়।
বৈশিষ্ট্য
- ডেটা ডিফার্ড বা বিলম্বিত ভাবে লোড করা হয়।
- মেমোরি এবং পারফরম্যান্সের জন্য কার্যকর, কারণ অপ্রয়োজনীয় ডেটা লোড হয় না।
- Hibernate এর ডিফল্ট লোডিং কৌশল।
উদাহরণ
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "category", fetch = FetchType.LAZY)
private List<Product> products;
// Getters and Setters
}
উপরের উদাহরণে Category থেকে Product লোড হবে না যতক্ষণ না getProducts() মেথড কল করা হয়।
ব্যবহার
Category category = categoryRepository.findById(1L).orElse(null);
System.out.println(category.getName()); // এখানে শুধুমাত্র `Category` টেবিল থেকে ডেটা লোড হবে।
System.out.println(category.getProducts()); // এখানে `Product` টেবিল থেকে ডেটা লোড হবে।
Eager Loading
Eager Loading হল এমন একটি লোডিং পদ্ধতি যেখানে সম্পর্কিত সমস্ত ডেটা প্রথম রিকোয়েস্টেই ডেটাবেস থেকে রিট্রিভ করা হয়।
বৈশিষ্ট্য
- ডেটা প্রাথমিকভাবে লোড করা হয়।
- কোড লেখার সময় সহজ মনে হলেও, অনেক ক্ষেত্রে অপ্রয়োজনীয় ডেটা লোড করার ফলে পারফরম্যান্স কমে যেতে পারে।
- স্পষ্টতভাবে
FetchType.EAGERব্যবহার করে কনফিগার করা যায়।
উদাহরণ
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "category", fetch = FetchType.EAGER)
private List<Product> products;
// Getters and Setters
}
উপরের উদাহরণে Category লোড করার সময় সম্পর্কিত Product ডেটাও লোড হবে।
ব্যবহার
Category category = categoryRepository.findById(1L).orElse(null);
System.out.println(category.getName()); // এখানে `Category` এবং `Product` উভয় টেবিল থেকে ডেটা লোড হবে।
Lazy এবং Eager Loading এর তুলনা
| বৈশিষ্ট্য | Lazy Loading | Eager Loading |
|---|---|---|
| ডেটা লোডিং টাইম | প্রয়োজন হলে ডেটা লোড করা হয়। | সম্পর্কিত ডেটা তাৎক্ষণিক লোড করা হয়। |
| মেমোরি ব্যবহারে কার্যকারিতা | বেশি কার্যকর, কারণ অপ্রয়োজনীয় ডেটা লোড হয় না। | কম কার্যকর, কারণ অপ্রয়োজনীয় ডেটা লোড হয়। |
| কনফিগারেশন ডিফল্ট | FetchType.LAZY | FetchType.EAGER |
| ব্যবহার ক্ষেত্র | বড় সম্পর্কিত ডেটাসেট যেখানে সবসময় ডেটা প্রয়োজন হয় না। | ছোট সম্পর্কিত ডেটাসেট যেখানে সবসময় ডেটা প্রয়োজন। |
| পারফরম্যান্স | কুয়েরি সংখ্যা বেশি হতে পারে। | বড় ডেটাসেটের ক্ষেত্রে ধীরগতি হতে পারে। |
Lazy এবং Eager Loading এর চ্যালেঞ্জ
Lazy Loading:
- LazyInitializationException: যখন Hibernate সেশন বন্ধ হয়ে যায় এবং Lazy ডেটা অ্যাক্সেস করা হয়।
- অতিরিক্ত কুয়েরি: একাধিক Lazy লোডিং কুয়েরি তৈরি হতে পারে।
Eager Loading:
- অপ্রয়োজনীয় ডেটা লোড: যদি লোড করা ডেটা ব্যবহার না হয়, মেমোরি এবং পারফরম্যান্সের ক্ষতি হয়।
- জটিল কুয়েরি: Eager লোডিং বড় ডেটাসেটের জন্য জটিল কুয়েরি তৈরি করতে পারে।
Practical Scenario
Lazy Loading উদাহরণ:
আপনার যদি Category এবং Product এর মধ্যে অনেক সম্পর্ক থাকে এবং Product সবসময় প্রয়োজন না হয়, তাহলে Lazy Loading উপযুক্ত।
Eager Loading উদাহরণ:
যদি সম্পর্কিত ডেটা সবসময় প্রয়োজন হয়, যেমন Order এবং OrderDetails এর ক্ষেত্রে, তাহলে Eager Loading ব্যবহার করা যেতে পারে।
সারাংশ
Lazy Loading এবং Eager Loading এর মধ্যে নির্বাচন নির্ভর করে অ্যাপ্লিকেশনের প্রয়োজনীয়তা এবং ডেটাবেসের স্ট্রাকচারের উপর। Lazy Loading ডেটার ব্যবহার কম হলে কার্যকর, আর Eager Loading যেখানে ডেটা সবসময় প্রয়োজন সেখানে উপযুক্ত। Spring Boot এবং Hibernate এই দুই কৌশল কনফিগার করতে ডেভেলপারদের পুরো স্বাধীনতা প্রদান করে।
Read more